<!DOCTYPE html>
<html class="client-nojs vector-feature-night-mode-disabled vector-feature-language-in-header-enabled vector-feature-language-in-main-page-header-disabled vector-feature-page-tools-pinned-disabled vector-feature-toc-pinned-clientpref-1 vector-feature-main-menu-pinned-disabled vector-feature-limited-width-clientpref-1 vector-feature-limited-width-content-enabled vector-feature-custom-font-size-clientpref-1 vector-feature-appearance-pinned-clientpref-1 vector-sticky-header-enabled" lang="en" dir="ltr"><head>
<meta charset="UTF-8">
<title>Bridging (programming)</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="canonical" href="https://en.wikipedia.org/wiki/Bridging_(programming)"> <link href="./mw/ext.cite.styles.css" rel="stylesheet" type="text/css">
<link href="./mw/skins.vector.icons.css" rel="stylesheet" type="text/css">
<link href="./mw/skins.vector.search.codex.styles.css" rel="stylesheet" type="text/css">
<link href="./mw/skins.vector.styles.css" rel="stylesheet" type="text/css">
<link href="./mw/user.styles.css" rel="stylesheet" type="text/css">
<meta name="ResourceLoaderDynamicStyles" content="">
<link rel="stylesheet" type="text/css" href="./mw/site.styles.css">
<link rel="stylesheet" type="text/css" href="./mw/noscript.css">
<link rel="stylesheet" type="text/css" href="./footer.css">
<link rel="stylesheet" type="text/css" href="./vector-2022.css">
</head>
<body class="skin--responsive skin-vector skin-vector-search-vue mediawiki ltr sitedir-ltr mw-hide-empty-elt ns-0 ns-subject page-Bridging_programming rootpage-Bridging_programming skin-vector-2022 action-view">
<div class="mw-page-container">
<div class="mw-page-container-inner">
<div class="mw-content-container">
<main id="content" class="mw-body">
<header class="mw-body-header vector-page-titlebar">
<h1 id="firstHeading" class="firstHeading mw-first-heading">
<span id="openzim-page-title" class="mw-page-title-main"><span class="mw-page-title-main">Bridging (programming)</span></span>
</h1>
</header>
<a id="top"></a>
<div id="bodyContent" class="vector-body ve-init-mw-desktopArticleTarget-targetContainer" aria-labelledby="firstHeading" data-mw-ve-target-container="">
<div id="mw-content-text" class="mw-body-content mw-content-ltr" lang="en" dir="ltr"><div class="mw-content-ltr mw-parser-output" lang="en" dir="ltr"><style data-mw-deduplicate="TemplateStyles:r1236090951">
/* start https://en.wikipedia.org/ */
.mw-parser-output .hatnote{font-style:italic}.mw-parser-output div.hatnote{padding-left:1.6em;margin-bottom:0.5em}.mw-parser-output .hatnote i{font-style:normal}.mw-parser-output .hatnote+link+.hatnote{margin-top:-0.5em}@media print{body.ns-0 .mw-parser-output .hatnote{display:none!important}}
/* end https://en.wikipedia.org/ */
</style><div role="note" class="hatnote navigation-not-searchable">This article is about systems that allow computer languages to inter-communicate. For the object-programming pattern, see <a href="Bridge_pattern" title="Bridge pattern">Bridge pattern</a>. For <a href="Computer_network" title="Computer network">computer networking</a> systems, see <a href="Network_bridge" title="Network bridge">Network bridge</a>.</div>
<p>In <a href="Computer_science" title="Computer science">computer science</a>, <b>bridging</b> describes systems that map the runtime behaviour of different <a href="Programming_language" title="Programming language">programming languages</a> so they can share common resources. They are often used to allow "foreign" languages to operate a host platform's native <a href="Object_library" class="mw-redirect" title="Object library">object libraries</a>, translating data and state across the two sides of the bridge. Bridging contrasts with "embedding" systems that allow limited interaction through a <a href="Black_box" title="Black box">black box</a> mechanism, where state sharing is limited or non-existent.
</p><p><a href="Apple_Inc." title="Apple Inc.">Apple Inc.</a> has made heavy use of bridging on several occasions, notably in early versions of <a href="Mac_OS_X" class="mw-redirect" title="Mac OS X">Mac OS X</a> which bridged to older "classic" systems using the <a href="Carbon_(API)" title="Carbon (API)">Carbon</a> system as well as <a href="Java_(programming_language)" title="Java (programming language)">Java</a>. <a href="Microsoft" title="Microsoft">Microsoft</a>'s <a href="Common_Language_Runtime" title="Common Language Runtime">Common Language Runtime</a>, introduced with the <a href=".NET_Framework" title=".NET Framework">.NET Framework</a>, was designed to be multi-language from the start, and avoided the need for extensive bridging solutions. Both platforms have more recently added new bridging systems for <a href="JavaScript" title="JavaScript">JavaScript</a>, Apple's ObjC-to-JS and Microsoft's HTML Bridge.
</p>
<meta property="mw:PageProp/toc">
<div class="mw-heading mw-heading2"><h2 id="Concepts">Concepts</h2></div>
<div class="mw-heading mw-heading3"><h3 id="Functions,_libraries_and_runtimes">Functions, libraries and runtimes</h3></div>
<p>Most programming languages include the concept of a <a href="Subroutine" class="mw-redirect" title="Subroutine">subroutine</a> or function, a mechanism that allows commonly used code to be encapsulated and re-used throughout a program. For instance, a program that makes heavy use of mathematics might need to perform the <a href="Square_root" title="Square root">square root</a> calculation on various numbers throughout the program, so this code might be isolated in a <code>sqrt(aNumber)</code> function that is "passed in" the number to perform the square root calculation on, and "returns" the result. In many cases the code in question already exists, either implemented in hardware or as part of the underlying <a href="Operating_system" title="Operating system">operating system</a> the program runs within. In these cases the <code>sqrt</code> function can be further simplified by calling the built-in code.
</p><p>Functions often fall into easily identifiable groups of similar capabilities, mathematics functions for instance, or handling text files. Functions are often gathered together in collections known as <a href="Library_(computing)" title="Library (computing)">libraries</a> that are supplied with the system or, more commonly in the past, the programming language. Each language has its own method of calling functions so the libraries written for one language may not work with another; the semantics for calling functions in <a href="C_(programming_language)" title="C (programming language)">C</a> is different from <a href="Pascal_(programming_language)" title="Pascal (programming language)">Pascal</a>, so generally C programs cannot call Pascal libraries and vice versa. The commonly used solution to this problem is to pick one set of <a href="Call_semantics" class="mw-redirect" title="Call semantics">call semantics</a> as the default system for the platform, and then have all programming languages conform to that standard.
</p><p>Most computer languages and platforms have generally added functionality that cannot be expressed in the call/return model of the function. <a href="Garbage_collection_(computer_science)" title="Garbage collection (computer science)">Garbage collection</a>, for instance, runs throughout the lifetime of the application's run. This sort of functionality is effectively "outside" the program, it is present but not expressed directly in the program itself. Functions like these are generally implemented in ever-growing <a href="Run-time_system" class="mw-redirect" title="Run-time system">runtime</a> systems, libraries that are compiled into programs but not necessarily visible within the code.
</p>
<div class="mw-heading mw-heading3"><h3 id="Shared_libraries_and_common_runtimes">Shared libraries and common runtimes</h3></div>
<p>The introduction of <a href="Shared_library" title="Shared library">shared library</a> systems changed the model of conventional program construction considerably. In the past, library code was copied directly into programs by the "<a href="Linker_(computing)" title="Linker (computing)">linker</a>" and effectively became part of the program. With <a href="Dynamic_linker" title="Dynamic linker">dynamic linking</a> the library code (normally) exists in only one place, a vendor-provided file in the system that all applications share. Early systems presented many problems, often in performance terms, and shared libraries were largely isolated to particular languages or platforms, as opposed to the operating system as a whole. Many of these problems were addressed through the 1990s, and by the early 2000s most major platforms had switched to shared libraries as the primary interface to the entire system.
</p><p>Although such systems addressed the problem of providing common code libraries for new applications, these systems generally added their own runtimes as well. This meant that the language, library, and now the entire system, were often tightly linked together. For instance, under <a href="OpenStep" title="OpenStep">OpenStep</a> the entire operating system was, in effect, an <a href="Objective-C" title="Objective-C">Objective-C</a> program. Any programs running on it that wished to use the extensive object suite provided in OpenStep would not only have to be able to call those libraries using Obj-C semantics, but also interact with the Obj-C runtime to provide basic control over the application.
</p><p>In contrast, <a href="Microsoft" title="Microsoft">Microsoft</a>'s <a href=".NET_Framework" title=".NET Framework">.NET Framework</a> was designed from the start to be able to support multiple languages, initially <a href="C_Sharp_(programming_language)" title="C Sharp (programming language)">C#</a>, <a href="C%2B%2B" title="C++">C++</a> and a new version of <a href="Visual_Basic" title="Visual Basic">Visual Basic</a>. To do this, MS isolated the object libraries and the runtime into the <a href="Common_Language_Infrastructure" title="Common Language Infrastructure">Common Language Infrastructure</a> (CLI). Instead of programs compiling directly from the <a href="Source_code" title="Source code">source code</a> to the underlying runtime format, as is the case in most languages, under the CLI model all languages are first compiled to the <a href="Common_Intermediate_Language" title="Common Intermediate Language">Common Intermediate Language</a> (CIL), which then calls into the <a href="Common_Language_Runtime" title="Common Language Runtime">Common Language Runtime</a> (CLR). In theory, any programming language can use the CLI system and use .NET objects.
</p>
<div class="mw-heading mw-heading3"><h3 id="Bridging">Bridging</h3></div>
<p>Although platforms like OSX and .NET offer the ability for most programming languages to be adapted to the platform's runtime system, it is also the case that these programming languages often have a target runtime in mind - <a href="Objective-C" title="Objective-C">Objective-C</a> essentially requires the Obj-C runtime, while C# does the same for the CLR. If one wants to use C# code within Obj-C, or vice versa, one has to find a version written to use the other runtime, which often does not exist.
</p><p>A more common version of this problem concerns the use of languages that are platform independent, like Java, which have their own runtimes and libraries. Although it is possible to build a Java compiler that calls the underlying system, like J#, such a system would not also be able to interact with other Java code unless it too was re-compiled. Access to code in Java libraries may be difficult or impossible.
</p><p>The rise of the <a href="Web_browser" title="Web browser">web browser</a> as a sort of virtual operating system has made this problem more acute. The modern "programming" paradigm under <a href="HTML5" title="HTML5">HTML5</a> includes the <a href="JavaScript" title="JavaScript">JavaScript</a> (JS) language, the <a href="Document_Object_Model" title="Document Object Model">Document Object Model</a> as a major library, and the browser itself as a runtime environment. Although it would be possible to build a version of JS that runs on the CLR, but this would largely defeat the purpose of a language designed largely for operating browsers - unless that compiler can interact with the browser directly, there is little purpose in using it.
</p><p>In these cases, and many like it, the need arises for a system that allows the two runtimes to interoperate. This is known as "bridging" the runtimes.
</p>
<div class="mw-heading mw-heading2"><h2 id="Examples">Examples</h2></div>
<div class="mw-heading mw-heading3"><h3 id="Apple">Apple</h3></div>
<p>Apple has made considerable use of bridging technologies since the earliest efforts that led to <a href="Mac_OS_X" class="mw-redirect" title="Mac OS X">Mac OS X</a>.
</p><p>When NeXT was first purchased by Apple, the plan was to build a new version of OpenStep, then-known as <a href="Rhapsody_(operating_system)" title="Rhapsody (operating system)">Rhapsody</a>, with an <a href="Emulator" title="Emulator">emulator</a> known as a Blue Box that would run "classic" Mac OS programs. This led to considerable push-back from the developer community, and Rhapsody was cancelled.<sup id="cite_ref-1" class="reference"><a href="#cite_note-1"><span class="cite-bracket">[</span>1<span class="cite-bracket">]</span></a></sup> In its place, OS X would implement many of the older Mac OS calls on top of core functionality in OpenStep, providing a path for existing applications to be gracefully migrated forward.
</p><p>To do this, Apple took useful code from the OpenStep platform and re-implemented the core functionality in a pure-C library known as <a href="Core_Foundation" title="Core Foundation">Core Foundation</a>, or CF for short. OpenStep's libraries calling CF underlying code became the <a href="Cocoa_API" class="mw-redirect" title="Cocoa API">Cocoa API</a>, while the new Mac-like C libraries became the <a href="Carbon_(API)" title="Carbon (API)">Carbon API</a>. As the C and Obj-C sides of the system needed to share data, and the data on the Obj-C side was normally stored in objects (as opposed to base types), conversions to and from CF could be expensive. Apple was not willing to pay this performance penalty, so they implemented a scheme known as "toll-free bridging" to help reduce or eliminate this problem.<sup id="cite_ref-2" class="reference"><a href="#cite_note-2"><span class="cite-bracket">[</span>2<span class="cite-bracket">]</span></a></sup>
</p><p>At the time, Java was becoming a major player in the programming world, and Apple also provided a Java bridging solution that was developed for the <a href="WebObjects" title="WebObjects">WebObjects</a> platform. This was a more classical bridging solution, with direct conversions between Java and OpenStep/CF types being completed in code, where required. Under Carbon, a program using CFStrings was using the same code as a Cocoa application using NSString, and the two could be bridged toll-free. With the Java bridge, CFStrings were instead cast into Java's own String objects, which required more work but made porting essentially invisible.<sup id="cite_ref-3" class="reference"><a href="#cite_note-3"><span class="cite-bracket">[</span>3<span class="cite-bracket">]</span></a></sup> Other developers made widespread use of similar technologies to provide support for other languages, including the "peering" system used to allow Obj-C code to call .NET code under <a href="Mono_(software)" title="Mono (software)">Mono</a>.<sup id="cite_ref-4" class="reference"><a href="#cite_note-4"><span class="cite-bracket">[</span>4<span class="cite-bracket">]</span></a></sup>
</p><p>As the need for these porting solutions waned, both Carbon and the Java Bridge were deprecated and eventually removed from later releases of the system.<sup id="cite_ref-5" class="reference"><a href="#cite_note-5"><span class="cite-bracket">[</span>5<span class="cite-bracket">]</span></a></sup><sup id="cite_ref-6" class="reference"><a href="#cite_note-6"><span class="cite-bracket">[</span>6<span class="cite-bracket">]</span></a></sup> Java support was migrated to using the <a href="Java_Native_Interface" title="Java Native Interface">Java Native Interface</a> (JNI), a standard from the Java world that allowed Java to interact with C-based code. On OSX, the JNI allowed Obj-C code to be used, with some difficulty.<sup id="cite_ref-7" class="reference"><a href="#cite_note-7"><span class="cite-bracket">[</span>7<span class="cite-bracket">]</span></a></sup>
</p><p>Around 2012, Apple's extensive work on <a href="WebKit" title="WebKit">WebKit</a> has led to the introduction of a new bridging technology that allows <a href="JavaScript" title="JavaScript">JavaScript</a> program code to call into the Obj-C/Cocoa runtime, and vice versa. This allows browser automation using Obj-C, or alternately, the automation of Cocoa applications using JavaScript. Originally part of the <a href="Safari_(web_browser)" title="Safari (web browser)">Safari web browser</a>, in 2013 the code was promoted to be part of the new OSX 10.9.<sup id="cite_ref-8" class="reference"><a href="#cite_note-8"><span class="cite-bracket">[</span>8<span class="cite-bracket">]</span></a></sup>
</p>
<div class="mw-heading mw-heading3"><h3 id="Microsoft">Microsoft</h3></div>
<p>Although there are some examples of bridging being used in the past, Microsoft's CLI system was intended to support languages on top of the .NET system rather than running under native runtimes and bridging. This led to a number of new languages being implemented in the CLI system, often including either a hash mark (#) or "Iron" in their name. See the <a href="List_of_CLI_languages" title="List of CLI languages">List of CLI languages</a> for a more comprehensive set of examples. This concept was seen as an example of MS's <a href="Embrace%2C_extend_and_extinguish" class="mw-redirect" title="Embrace, extend and extinguish">embrace, extend and extinguish</a> behaviour, as it produced Java-like languages (C# and <a href="J_Sharp" class="mw-redirect" title="J Sharp">J#</a> for instance) that did not work with other Java code or used their libraries.
</p><p>Nevertheless, the "classic" Windows ecosystem included considerable code that would be needed to be used within the .NET world, and for this role MS introduced a well supported bridging system. The system included numerous utilities and language features to ease the use of Windows or Visual Basic code within the .NET system,<sup id="cite_ref-9" class="reference"><a href="#cite_note-9"><span class="cite-bracket">[</span>9<span class="cite-bracket">]</span></a></sup> or vice versa.<sup id="cite_ref-10" class="reference"><a href="#cite_note-10"><span class="cite-bracket">[</span>10<span class="cite-bracket">]</span></a></sup>
</p><p>Microsoft has also introduced a JavaScript bridging technology for <a href="Silverlight" class="mw-redirect" title="Silverlight">Silverlight</a>, the HTML Bridge. The Bridge exposes JS types to .NET code, .NET types to JS code, and manages memory and access safety between them.<sup id="cite_ref-11" class="reference"><a href="#cite_note-11"><span class="cite-bracket">[</span>11<span class="cite-bracket">]</span></a></sup><sup id="cite_ref-12" class="reference"><a href="#cite_note-12"><span class="cite-bracket">[</span>12<span class="cite-bracket">]</span></a></sup>
</p>
<div class="mw-heading mw-heading3"><h3 id="Other_examples">Other examples</h3></div>
<p>Similar bridging technologies, often with JavaScript on one side, are common on various platforms. One example is JS bridge for the <a href="Android_OS" class="mw-redirect" title="Android OS">Android OS</a> written as an example.<sup id="cite_ref-13" class="reference"><a href="#cite_note-13"><span class="cite-bracket">[</span>13<span class="cite-bracket">]</span></a></sup>
</p><p>The term is also sometimes used to describe <a href="Object-relational_mapping" class="mw-redirect" title="Object-relational mapping">object-relational mapping</a> systems, which bridge the divide between the <a href="SQL" title="SQL">SQL</a> database world and modern object programming languages.
</p>
<div class="mw-heading mw-heading2"><h2 id="References">References</h2></div>
<style data-mw-deduplicate="TemplateStyles:r1239543626">
/* start https://en.wikipedia.org/ */
.mw-parser-output .reflist{margin-bottom:0.5em;list-style-type:decimal}@media screen{.mw-parser-output .reflist{font-size:90%}}.mw-parser-output .reflist .references{font-size:100%;margin-bottom:0;list-style-type:inherit}.mw-parser-output .reflist-columns-2{column-width:30em}.mw-parser-output .reflist-columns-3{column-width:25em}.mw-parser-output .reflist-columns{margin-top:0.3em}.mw-parser-output .reflist-columns ol{margin-top:0}.mw-parser-output .reflist-columns li{page-break-inside:avoid;break-inside:avoid-column}.mw-parser-output .reflist-upper-alpha{list-style-type:upper-alpha}.mw-parser-output .reflist-upper-roman{list-style-type:upper-roman}.mw-parser-output .reflist-lower-alpha{list-style-type:lower-alpha}.mw-parser-output .reflist-lower-greek{list-style-type:lower-greek}.mw-parser-output .reflist-lower-roman{list-style-type:lower-roman}
/* end https://en.wikipedia.org/ */
</style><div class="reflist">
<div class="mw-references-wrap mw-references-columns"><ol class="references">
<li id="cite_note-1"><span class="mw-cite-backlink"><b><a href="#cite_ref-1">^</a></b></span> <span class="reference-text">Dave Winer, <a rel="nofollow" class="external text" href="http://scripting.com/davenet/1998/05/12/rhapsodyCancelled.html">"Rhapsody Cancelled"</a>, 12 May 1998</span>
</li>
<li id="cite_note-2"><span class="mw-cite-backlink"><b><a href="#cite_ref-2">^</a></b></span> <span class="reference-text"><a rel="nofollow" class="external text" href="https://developer.apple.com/library/mac/#documentation/CoreFoundation/Conceptual/CFDesignConcepts/Articles/tollFreeBridgedTypes.html">"Toll-Free Bridged Types"</a>, Apple, 19 September 2012</span>
</li>
<li id="cite_note-3"><span class="mw-cite-backlink"><b><a href="#cite_ref-3">^</a></b></span> <span class="reference-text"><a rel="nofollow" class="external text" href="https://developer.apple.com/legacy/library/documentation/Cocoa/Conceptual/Legacy/JavaBridge/JavaBridge.pdf">"Using the Java Bridge"</a>, Apple</span>
</li>
<li id="cite_note-4"><span class="mw-cite-backlink"><b><a href="#cite_ref-4">^</a></b></span> <span class="reference-text"><a rel="nofollow" class="external text" href="http://www.monobjc.net/bridging">"Bridging"</a></span>
</li>
<li id="cite_note-5"><span class="mw-cite-backlink"><b><a href="#cite_ref-5">^</a></b></span> <span class="reference-text">Andrew Youll, <a rel="nofollow" class="external text" href="http://www.osnews.com/story/11165">"Apple Drops the Cocoa-Java Bridge"</a>, OSNews, 10 July 2005</span>
</li>
<li id="cite_note-6"><span class="mw-cite-backlink"><b><a href="#cite_ref-6">^</a></b></span> <span class="reference-text"><a rel="nofollow" class="external text" href="https://developer.apple.com/library/mac/#releasenotes/General/CarbonCoreDeprecations/">"Carbon Core Deprecations"</a>, Apple, 23 July 2013</span>
</li>
<li id="cite_note-7"><span class="mw-cite-backlink"><b><a href="#cite_ref-7">^</a></b></span> <span class="reference-text"><a rel="nofollow" class="external text" href="https://developer.apple.com/legacy/library/#technotes/tn2147/_index.html">"Technical Note TN2147: JNI Development on Mac OS X"</a>, Apple, 14 July 2011</span>
</li>
<li id="cite_note-8"><span class="mw-cite-backlink"><b><a href="#cite_ref-8">^</a></b></span> <span class="reference-text">Nigel Brooke, <a rel="nofollow" class="external text" href="http://www.steamclock.com/blog/2013/05/apple-objective-c-javascript-bridge/">"Apple's New Objective-C to JavaScript Bridge"</a>, 14 May 2013</span>
</li>
<li id="cite_note-9"><span class="mw-cite-backlink"><b><a href="#cite_ref-9">^</a></b></span> <span class="reference-text">Jason Clark, <a rel="nofollow" class="external text" href="http://msdn.microsoft.com/en-us/magazine/cc164123.aspx">"Calling A .NET Managed Method from Native Code"</a>, MSDN Magazine</span>
</li>
<li id="cite_note-10"><span class="mw-cite-backlink"><b><a href="#cite_ref-10">^</a></b></span> <span class="reference-text"><a rel="nofollow" class="external text" href="http://support.microsoft.com/kb/953836">"Calling A .NET Managed Method from Native Code"</a>, Microsoft</span>
</li>
<li id="cite_note-11"><span class="mw-cite-backlink"><b><a href="#cite_ref-11">^</a></b></span> <span class="reference-text"><a rel="nofollow" class="external text" href="http://msdn.microsoft.com/en-us/library/cc645076(v=vs.95).aspx">"HTML Bridge: Interaction Between HTML and Managed Code"</a>, Microsoft</span>
</li>
<li id="cite_note-12"><span class="mw-cite-backlink"><b><a href="#cite_ref-12">^</a></b></span> <span class="reference-text"><a rel="nofollow" class="external text" href="http://msdn.microsoft.com/en-us/sharepointandsilverlighttrainingcourse_usinghtmlbridgelab.aspx">"Using the HTML Bridge"</a>, Microsoft</span>
</li>
<li id="cite_note-13"><span class="mw-cite-backlink"><b><a href="#cite_ref-13">^</a></b></span> <span class="reference-text"><a rel="nofollow" class="external text" href="http://blog.objectgraph.com/index.php/2012/03/16/android-development-javascript-bridge-example-fully-explained/">"Android Development: JavaScript Bridge Example – Fully Explained!"</a> <a rel="nofollow" class="external text" href="https://web.archive.org/web/20130729032910/http://blog.objectgraph.com/index.php/2012/03/16/android-development-javascript-bridge-example-fully-explained/">Archived</a> July 29, 2013, at the <a href="Wayback_Machine" title="Wayback Machine">Wayback Machine</a>, object graph, 16 May 2012</span>
</li>
</ol></div></div></div><!--htdig_noindex--><div><div class="zim-footer">
This article is issued from <a class="external text" title="Last edited on 2023-11-01" href="https://en.wikipedia.org/wiki/?title=Bridging_(programming)&oldid=1183000446">Wikipedia</a>. The text is available under <a class="external text" href="https://creativecommons.org/licenses/by-sa/4.0/deed.en">Creative Commons Attribution-Share Alike 4.0</a> unless otherwise noted. Additional terms may apply for the media files.
</div>
</div><!--/htdig_noindex--></div>
</div>
</main>
</div>
</div>
</div>
</body></html>